/*******************************************************************************
 * Copyright (c) 2018, College of William & Mary
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the College of William & Mary nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COLLEGE OF WILLIAM & MARY BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * PRIMME: https://github.com/primme/primme
 * Contact: Andreas Stathopoulos, a n d r e a s _at_ c s . w m . e d u
 *******************************************************************************
 *   NOTE: THIS FILE IS AUTOMATICALLY GENERATED. PLEASE DON'T MODIFY
 ******************************************************************************/


#ifndef factorize_H
#define factorize_H
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Sprimme)
#  define UDUDecompose_Sprimme CONCAT(UDUDecompose_,SCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Rprimme)
#  define UDUDecompose_Rprimme CONCAT(UDUDecompose_,REAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SHprimme)
#  define UDUDecompose_SHprimme CONCAT(UDUDecompose_,HOST_SCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RHprimme)
#  define UDUDecompose_RHprimme CONCAT(UDUDecompose_,HOST_REAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SXprimme)
#  define UDUDecompose_SXprimme CONCAT(UDUDecompose_,XSCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RXprimme)
#  define UDUDecompose_RXprimme CONCAT(UDUDecompose_,XREAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Shprimme)
#  define UDUDecompose_Shprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(h,k)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Rhprimme)
#  define UDUDecompose_Rhprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(STEM_C,h),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Ssprimme)
#  define UDUDecompose_Ssprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Rsprimme)
#  define UDUDecompose_Rsprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(STEM_C,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Sdprimme)
#  define UDUDecompose_Sdprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Rdprimme)
#  define UDUDecompose_Rdprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(STEM_C,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Sqprimme)
#  define UDUDecompose_Sqprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_Rqprimme)
#  define UDUDecompose_Rqprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(STEM_C,q),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SXhprimme)
#  define UDUDecompose_SXhprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,USE_ARITH(h,k)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RXhprimme)
#  define UDUDecompose_RXhprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,h),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SXsprimme)
#  define UDUDecompose_SXsprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RXsprimme)
#  define UDUDecompose_RXsprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SXdprimme)
#  define UDUDecompose_SXdprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RXdprimme)
#  define UDUDecompose_RXdprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SXqprimme)
#  define UDUDecompose_SXqprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RXqprimme)
#  define UDUDecompose_RXqprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,q),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SHhprimme)
#  define UDUDecompose_SHhprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RHhprimme)
#  define UDUDecompose_RHhprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SHsprimme)
#  define UDUDecompose_SHsprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RHsprimme)
#  define UDUDecompose_RHsprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SHdprimme)
#  define UDUDecompose_SHdprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RHdprimme)
#  define UDUDecompose_RHdprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_SHqprimme)
#  define UDUDecompose_SHqprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUDecompose_RHqprimme)
#  define UDUDecompose_RHqprimme CONCAT(UDUDecompose_,CONCAT(CONCAT(CONCAT(,q),primme),))
#endif
int UDUDecompose_dprimme(dummy_type_dprimme *M, int ldM, dummy_type_dprimme *UDU, int ldUDU,
      int *ipivot, int dimM, primme_context ctx);
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Sprimme)
#  define UDUSolve_Sprimme CONCAT(UDUSolve_,SCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Rprimme)
#  define UDUSolve_Rprimme CONCAT(UDUSolve_,REAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SHprimme)
#  define UDUSolve_SHprimme CONCAT(UDUSolve_,HOST_SCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RHprimme)
#  define UDUSolve_RHprimme CONCAT(UDUSolve_,HOST_REAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SXprimme)
#  define UDUSolve_SXprimme CONCAT(UDUSolve_,XSCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RXprimme)
#  define UDUSolve_RXprimme CONCAT(UDUSolve_,XREAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Shprimme)
#  define UDUSolve_Shprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(h,k)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Rhprimme)
#  define UDUSolve_Rhprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(STEM_C,h),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Ssprimme)
#  define UDUSolve_Ssprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Rsprimme)
#  define UDUSolve_Rsprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(STEM_C,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Sdprimme)
#  define UDUSolve_Sdprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Rdprimme)
#  define UDUSolve_Rdprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(STEM_C,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Sqprimme)
#  define UDUSolve_Sqprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_Rqprimme)
#  define UDUSolve_Rqprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(STEM_C,q),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SXhprimme)
#  define UDUSolve_SXhprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(h,k)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RXhprimme)
#  define UDUSolve_RXhprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,h),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SXsprimme)
#  define UDUSolve_SXsprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RXsprimme)
#  define UDUSolve_RXsprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SXdprimme)
#  define UDUSolve_SXdprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RXdprimme)
#  define UDUSolve_RXdprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SXqprimme)
#  define UDUSolve_SXqprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RXqprimme)
#  define UDUSolve_RXqprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,q),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SHhprimme)
#  define UDUSolve_SHhprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RHhprimme)
#  define UDUSolve_RHhprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SHsprimme)
#  define UDUSolve_SHsprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RHsprimme)
#  define UDUSolve_RHsprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SHdprimme)
#  define UDUSolve_SHdprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RHdprimme)
#  define UDUSolve_RHdprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_SHqprimme)
#  define UDUSolve_SHqprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(UDUSolve_RHqprimme)
#  define UDUSolve_RHqprimme CONCAT(UDUSolve_,CONCAT(CONCAT(CONCAT(,q),primme),))
#endif
int UDUSolve_dprimme(dummy_type_dprimme *UDU, int *ipivot, int dim, dummy_type_dprimme *rhs, int nrhs,
      int ldrhs, dummy_type_dprimme *sol, int ldsol, primme_context ctx);
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Sprimme)
#  define update_XKinvBX_Sprimme CONCAT(update_XKinvBX_,SCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Rprimme)
#  define update_XKinvBX_Rprimme CONCAT(update_XKinvBX_,REAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SHprimme)
#  define update_XKinvBX_SHprimme CONCAT(update_XKinvBX_,HOST_SCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RHprimme)
#  define update_XKinvBX_RHprimme CONCAT(update_XKinvBX_,HOST_REAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SXprimme)
#  define update_XKinvBX_SXprimme CONCAT(update_XKinvBX_,XSCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RXprimme)
#  define update_XKinvBX_RXprimme CONCAT(update_XKinvBX_,XREAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Shprimme)
#  define update_XKinvBX_Shprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(h,k)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Rhprimme)
#  define update_XKinvBX_Rhprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(STEM_C,h),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Ssprimme)
#  define update_XKinvBX_Ssprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Rsprimme)
#  define update_XKinvBX_Rsprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(STEM_C,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Sdprimme)
#  define update_XKinvBX_Sdprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Rdprimme)
#  define update_XKinvBX_Rdprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(STEM_C,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Sqprimme)
#  define update_XKinvBX_Sqprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_Rqprimme)
#  define update_XKinvBX_Rqprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(STEM_C,q),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SXhprimme)
#  define update_XKinvBX_SXhprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,USE_ARITH(h,k)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RXhprimme)
#  define update_XKinvBX_RXhprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,h),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SXsprimme)
#  define update_XKinvBX_SXsprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RXsprimme)
#  define update_XKinvBX_RXsprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SXdprimme)
#  define update_XKinvBX_SXdprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RXdprimme)
#  define update_XKinvBX_RXdprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SXqprimme)
#  define update_XKinvBX_SXqprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RXqprimme)
#  define update_XKinvBX_RXqprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,q),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SHhprimme)
#  define update_XKinvBX_SHhprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RHhprimme)
#  define update_XKinvBX_RHhprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SHsprimme)
#  define update_XKinvBX_SHsprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RHsprimme)
#  define update_XKinvBX_RHsprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SHdprimme)
#  define update_XKinvBX_SHdprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RHdprimme)
#  define update_XKinvBX_RHdprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_SHqprimme)
#  define update_XKinvBX_SHqprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(update_XKinvBX_RHqprimme)
#  define update_XKinvBX_RHqprimme CONCAT(update_XKinvBX_,CONCAT(CONCAT(CONCAT(,q),primme),))
#endif
int update_XKinvBX_dprimme(dummy_type_dprimme *X, PRIMME_INT ldX, dummy_type_dprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_dprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_dprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Sprimme)
#  define MSolve_Sprimme CONCAT(MSolve_,SCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Rprimme)
#  define MSolve_Rprimme CONCAT(MSolve_,REAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SHprimme)
#  define MSolve_SHprimme CONCAT(MSolve_,HOST_SCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RHprimme)
#  define MSolve_RHprimme CONCAT(MSolve_,HOST_REAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SXprimme)
#  define MSolve_SXprimme CONCAT(MSolve_,XSCALAR_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RXprimme)
#  define MSolve_RXprimme CONCAT(MSolve_,XREAL_SUF)
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Shprimme)
#  define MSolve_Shprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(h,k)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Rhprimme)
#  define MSolve_Rhprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(STEM_C,h),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Ssprimme)
#  define MSolve_Ssprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Rsprimme)
#  define MSolve_Rsprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(STEM_C,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Sdprimme)
#  define MSolve_Sdprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Rdprimme)
#  define MSolve_Rdprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(STEM_C,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Sqprimme)
#  define MSolve_Sqprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(STEM_C,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_Rqprimme)
#  define MSolve_Rqprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(STEM_C,q),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SXhprimme)
#  define MSolve_SXhprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(h,k)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RXhprimme)
#  define MSolve_RXhprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,h),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SXsprimme)
#  define MSolve_SXsprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RXsprimme)
#  define MSolve_RXsprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SXdprimme)
#  define MSolve_SXdprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RXdprimme)
#  define MSolve_RXdprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SXqprimme)
#  define MSolve_SXqprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RXqprimme)
#  define MSolve_RXqprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,q),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SHhprimme)
#  define MSolve_SHhprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RHhprimme)
#  define MSolve_RHhprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SHsprimme)
#  define MSolve_SHsprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(s,c)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RHsprimme)
#  define MSolve_RHsprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,s),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SHdprimme)
#  define MSolve_SHdprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(d,z)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RHdprimme)
#  define MSolve_RHdprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,d),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_SHqprimme)
#  define MSolve_SHqprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,USE_ARITH(q,w)),primme),))
#endif
#if !defined(CHECK_TEMPLATE) && !defined(MSolve_RHqprimme)
#  define MSolve_RHqprimme CONCAT(MSolve_,CONCAT(CONCAT(CONCAT(,q),primme),))
#endif
int MSolve_dprimme(dummy_type_dprimme *Mfact, int *ipivot, int dim, dummy_type_dprimme *rhs, int nrhs,
      int ldrhs, dummy_type_dprimme *sol, int ldsol, primme_context ctx);
int update_XKinvBX_hprimme(dummy_type_hprimme *X, PRIMME_INT ldX, dummy_type_hprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_sprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_sprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_kprimme(dummy_type_kprimme *X, PRIMME_INT ldX, dummy_type_kprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_cprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_cprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int UDUDecompose_sprimme(dummy_type_sprimme *M, int ldM, dummy_type_sprimme *UDU, int ldUDU,
      int *ipivot, int dimM, primme_context ctx);
int UDUSolve_sprimme(dummy_type_sprimme *UDU, int *ipivot, int dim, dummy_type_sprimme *rhs, int nrhs,
      int ldrhs, dummy_type_sprimme *sol, int ldsol, primme_context ctx);
int update_XKinvBX_sprimme(dummy_type_sprimme *X, PRIMME_INT ldX, dummy_type_sprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_sprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_sprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int MSolve_sprimme(dummy_type_sprimme *Mfact, int *ipivot, int dim, dummy_type_sprimme *rhs, int nrhs,
      int ldrhs, dummy_type_sprimme *sol, int ldsol, primme_context ctx);
int UDUDecompose_cprimme(dummy_type_cprimme *M, int ldM, dummy_type_cprimme *UDU, int ldUDU,
      int *ipivot, int dimM, primme_context ctx);
int UDUSolve_cprimme(dummy_type_cprimme *UDU, int *ipivot, int dim, dummy_type_cprimme *rhs, int nrhs,
      int ldrhs, dummy_type_cprimme *sol, int ldsol, primme_context ctx);
int update_XKinvBX_cprimme(dummy_type_cprimme *X, PRIMME_INT ldX, dummy_type_cprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_cprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_cprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int MSolve_cprimme(dummy_type_cprimme *Mfact, int *ipivot, int dim, dummy_type_cprimme *rhs, int nrhs,
      int ldrhs, dummy_type_cprimme *sol, int ldsol, primme_context ctx);
int UDUDecompose_zprimme(dummy_type_zprimme *M, int ldM, dummy_type_zprimme *UDU, int ldUDU,
      int *ipivot, int dimM, primme_context ctx);
int UDUSolve_zprimme(dummy_type_zprimme *UDU, int *ipivot, int dim, dummy_type_zprimme *rhs, int nrhs,
      int ldrhs, dummy_type_zprimme *sol, int ldsol, primme_context ctx);
int update_XKinvBX_zprimme(dummy_type_zprimme *X, PRIMME_INT ldX, dummy_type_zprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_zprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_zprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int MSolve_zprimme(dummy_type_zprimme *Mfact, int *ipivot, int dim, dummy_type_zprimme *rhs, int nrhs,
      int ldrhs, dummy_type_zprimme *sol, int ldsol, primme_context ctx);
int update_XKinvBX_magma_hprimme(dummy_type_magma_hprimme *X, PRIMME_INT ldX, dummy_type_magma_hprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_sprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_sprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_magma_kprimme(dummy_type_magma_kprimme *X, PRIMME_INT ldX, dummy_type_magma_kprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_cprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_cprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_magma_sprimme(dummy_type_magma_sprimme *X, PRIMME_INT ldX, dummy_type_magma_sprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_sprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_sprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_magma_cprimme(dummy_type_magma_cprimme *X, PRIMME_INT ldX, dummy_type_magma_cprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_cprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_cprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_magma_dprimme(dummy_type_magma_dprimme *X, PRIMME_INT ldX, dummy_type_magma_dprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_dprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_dprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_magma_zprimme(dummy_type_magma_zprimme *X, PRIMME_INT ldX, dummy_type_magma_zprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_zprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_zprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_cublas_hprimme(dummy_type_cublas_hprimme *X, PRIMME_INT ldX, dummy_type_cublas_hprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_sprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_sprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_cublas_kprimme(dummy_type_cublas_kprimme *X, PRIMME_INT ldX, dummy_type_cublas_kprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_cprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_cprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_cublas_sprimme(dummy_type_cublas_sprimme *X, PRIMME_INT ldX, dummy_type_cublas_sprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_sprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_sprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_cublas_cprimme(dummy_type_cublas_cprimme *X, PRIMME_INT ldX, dummy_type_cublas_cprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_cprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_cprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_cublas_dprimme(dummy_type_cublas_dprimme *X, PRIMME_INT ldX, dummy_type_cublas_dprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_dprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_dprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
int update_XKinvBX_cublas_zprimme(dummy_type_cublas_zprimme *X, PRIMME_INT ldX, dummy_type_cublas_zprimme *KinvBX,
      PRIMME_INT ldKinvBX, dummy_type_zprimme *M, int ldM, int numCols,
      int blockSize, dummy_type_zprimme *Mfact, int ldMfact, int *ipivot,
      primme_context ctx);
#endif
